#include "drv_sht20.h"
#include "drv_iic.h"
#include "drv_systick.h"


/**************************************
函数名：drv_sht20_init
函数功能：对sht20引脚进行初始化
输入参数：无
输出参数：无
其它： 
****************************************/
void drv_sht20_init(void)
{
	drv_iic_init();
}

/**************************************
函数名：drv_sht20_reset
函数功能：对sht20进行复位
输入参数：无
输出参数：无
其它： 复位命令是0xfe
****************************************/
uint8_t drv_sht20_reset(void)
{
	drv_iic_start();//对IIC引脚进行初始化
	drv_send_data(0x80);//发送一个IIC地址
	if(drv_wait_ACK() != ACK)
	{
		drv_iic_stop();
		return NOACK;
	}
	drv_send_data(0xfe);
	if(drv_wait_ACK() != ACK)
	{
		drv_iic_stop();
		return NOACK;
	}
	drv_iic_stop();
	return ACK;
}

/**************************************
函数名：drv_sht20_read
函数功能：读取sht20传感器参数	0xe5是读取湿度，0xe3是温度
输入参数：cmd：读取参数的命令
输出参数：无
其它： 
****************************************/
uint16_t drv_sht20_read(uint8_t cmd)
{
	uint16_t read_data=0;
	uint8_t temp[2];
	drv_iic_start();
	drv_send_data(0x80);
	if(drv_wait_ACK() != ACK)
	{
		drv_iic_stop();
		return NOACK;
	}
	drv_send_data(cmd);
	if(drv_wait_ACK() != ACK)
	{
		drv_iic_stop();
		return NOACK;
	}
	drv_iic_start();
	drv_send_data(0x81);
	if(drv_wait_ACK() != ACK)
	{
		drv_iic_stop();
		return NOACK;
	}
	if(cmd == 0xe5)
	{
		drv_systick_ms(30);
	}
	else if(cmd == 0xe3)
	{
		drv_systick_ms(85);
	}
	temp[0] = drv_read_data(ACK);
	temp[1] = drv_read_data(NOACK);
	drv_iic_stop();
	read_data = (temp[0]<<8|temp[1]);
	return read_data;
}

/**************************************
函数名：drv_sht20_getdata

函数功能：将读取sht20传感器参数，转换为实际值

输入参数：cmd：读取参数的命令 0xe5是读取湿度,0xe3是温度

输出参数：无

其它：
	温度：T= -46.85+175.72*采集值/65536
	湿度：RH = -6+125*采集值/65536
****************************************/
sht20_val drv_sht20_getdata(void)
{
	sht20_val sht20_data;
	uint16_t tmp=0;
	tmp = drv_sht20_read(0xe5);
	sht20_data.hum_RH = -6+125*((float)tmp/65536);
	tmp = drv_sht20_read(0xe3);
	sht20_data.hum_T = -46.85+175.72*((float)tmp/65536);
	printf("RH=%.2f\t T=%.2f\r\n",sht20_data.hum_RH,sht20_data.hum_T);
	return sht20_data;
}

